package qualomelhor.gwt.modules.client;

import java.util.ArrayList;
import qualomelhor.database.Comparacao;
import qualomelhor.database.ParametrosSistema;
import qualomelhor.database.Usuario;
import qualomelhor.game.TestePlayN;
import qualomelhor.gwt.modules.client.ImageSliderWidget.TipoAnimacao;
import qualomelhor.gwt.modules.client.event.ImagemDisponivelEvent;
import qualomelhor.gwt.modules.client.event.ImagemNaoDisponivelEvent;
import qualomelhor.gwt.modules.client.event.ImagensJaSelecionadasEvent;
import qualomelhor.gwt.modules.client.interfaces.BuscaImagemEventHandler;
import com.MJC.client.Effects.Slide;
import com.MJC.client.Effects.Slides.SlideDown;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FileUpload;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

public class CriarComparacao1Coisa implements EntryPoint {
	private RootPanel root;
	private BuscaImagemWidget biProd1;
	private BuscaImagemWidget biProd2;
	private VerticalPanel vertPanelProd1;
	private VerticalPanel vertPanelProd2;
	private TextBox txtBuscaProd1;
	private TextBox txtBuscaProd2;
	private ListBox listPerguntas;
	private TextBox txtPerguntaIntermed;
	private Label lbPerguntaFinal;
	private FileUpload upload;
	private ISessionSuportServiceAsync serviceSupportSvc = GWT.create(ISessionSuportService.class);
	private LanguageConstants constants = GWT.create(LanguageConstants.class);
	private LanguageMessages messages = GWT.create(LanguageMessages.class);
	private Usuario u;

	int currentRow;
	FlexTable resultsTable;

	public static native void trocaExpressao(int expressao) /*-{
		$wnd.trocaExpressao(expressao);
	}-*/;

	@Override
	public void onModuleLoad() {
		System.out.println("Iniciando modulo...");
		root = RootPanel.get("divCadastro");
		root.clear();
		root.add(new Label("Busca:"));
		carregaFormComparacao2Coisas();
		trocaExpressao(1);
	}

	private void carregaFormComparacao2Coisas() {
		root.clear();

		HorizontalPanel horPanelMain = new HorizontalPanel();
		horPanelMain.setBorderWidth(1);
		root.add(horPanelMain);
		horPanelMain.setWidth("100%");

		vertPanelProd1 = new VerticalPanel();
		horPanelMain.add(vertPanelProd1);
		horPanelMain.setCellWidth(vertPanelProd1, "40%");

		//Mascote
		VerticalPanel absPanelMasc = new VerticalPanel();
		horPanelMain.add(absPanelMasc);

		final Image[] matrImage = new Image[3];
		matrImage[0] = new Image("/images/avatar/olho/olhos1.png");
		matrImage[1] = new Image("/images/avatar/olho/olhos2.png");
		//matrImage[2] = panelimages.olho3().createImage();
		matrImage[2] = new Image("/images/avatar/olho/olhos3.png");

		final ImageSliderWidget isw = new ImageSliderWidget(matrImage, ImageSliderWidget.TipoAnimacao.BLIND);
		absPanelMasc.add(isw);
		System.out.println("Adicionou imagesliderwidget...");

		Button b = new Button("Start anim..");
		final Slide s = new Slide(b, new SlideDown());
		b.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				isw.iniciaAnimacao();
			}
		});
		absPanelMasc.add(b);

		Button b2 = new Button("troca z order");
		b2.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				isw.alternaZOrder(0);
			}
		});
		absPanelMasc.add(b2);

		
		horPanelMain.setCellWidth(absPanelMasc, "20%");

		vertPanelProd2 = new VerticalPanel();
		horPanelMain.add(vertPanelProd2);
		horPanelMain.setCellWidth(vertPanelProd2, "40%");

		solicitaProduto1();
	}

	private void solicitaProduto1() {
		Label lb = new Label(constants.digite_o_primeiro_item_que_voce_quer_comparar());
		vertPanelProd1.add(lb);

		txtBuscaProd1 = new TextBox();
		vertPanelProd1.add(txtBuscaProd1);

		final Button btnBuscaProd1 = new Button(constants.proximo());
		vertPanelProd1.add(btnBuscaProd1);
		btnBuscaProd1.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				biProd1.setBusca(txtBuscaProd1.getText());
			}
		});

		biProd1 = new BuscaImagemWidget();
		vertPanelProd1.add(biProd1);

		final Button btnConfirmaImagens = new Button(constants.proximo());
		btnConfirmaImagens.setEnabled(false);
		btnConfirmaImagens.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				ArrayList<String> listImagens = biProd1.getSelectedImagesSource();

				vertPanelProd1.clear();

				Label lb = new Label(txtBuscaProd1.getText());
				vertPanelProd1.add(lb);

				HorizontalPanel horPImagens = new HorizontalPanel();
				vertPanelProd1.add(horPImagens);

				
				Image[] matrImages = new Image[listImagens.size()];
				for (int i = 0; i < listImagens.size(); i++) {
					matrImages[i] = new Image(listImagens.get(i));
					matrImages[i].setSize("100px", "100px");
				}
				ImageSliderWidget isw = new ImageSliderWidget(matrImages, TipoAnimacao.FADE);
				horPImagens.add(isw);
				isw.iniciaAnimacao();

				solicitaProduto2();
			}
		});

		vertPanelProd1.add(btnConfirmaImagens);

		biProd1.addImagemSelecionadaHandler(new BuscaImagemEventHandler() {
			@Override
			public void onListaPronta(ImagemDisponivelEvent event) {
				btnConfirmaImagens.setEnabled(true);
			}

			@Override
			public void onListaNaoPronta(ImagemNaoDisponivelEvent event) {
				btnConfirmaImagens.setEnabled(false);
			}

			@Override
			public void onImagensJaSelecionadas(ImagensJaSelecionadasEvent event) {
				// TODO Auto-generated method stub
				
			}
		});
	}

	private void solicitaProduto2() {
		
		Label lb = new Label(constants.digite_o_segundo_item_que_voce_quer_comparar());
		vertPanelProd2.add(lb);

		txtBuscaProd2 = new TextBox();
		vertPanelProd2.add(txtBuscaProd2);

		final Button btnBuscaProd2 = new Button(constants.proximo());
		vertPanelProd2.add(btnBuscaProd2);
		btnBuscaProd2.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				biProd2.setBusca(txtBuscaProd2.getText());
			}
		});

		biProd2 = new BuscaImagemWidget();
		vertPanelProd2.add(biProd2);

		final Button btnConfirmaImagens = new Button(constants.proximo());
		btnConfirmaImagens.setEnabled(false);
		btnConfirmaImagens.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				ArrayList<String> listImagens = biProd2.getSelectedImagesSource();

				vertPanelProd2.clear();

				Label lb = new Label(txtBuscaProd2.getText());
				vertPanelProd2.add(lb);

				HorizontalPanel horPImagens = new HorizontalPanel();
				vertPanelProd2.add(horPImagens);

				for (int i = 0; i < listImagens.size(); i++) {
					Image im = new Image(listImagens.get(i));
					im.setSize("100px", "100px");
					horPImagens.add(im);
				}

				Window.alert("Carregando form qual a pergunta...");
				carregaFormQualAPergunta();
			}
		});

		vertPanelProd2.add(btnConfirmaImagens);

		biProd2.addImagemSelecionadaHandler(new BuscaImagemEventHandler() {
			@Override
			public void onListaPronta(ImagemDisponivelEvent event) {
				btnConfirmaImagens.setEnabled(true);
			}

			@Override
			public void onListaNaoPronta(ImagemNaoDisponivelEvent event) {
				btnConfirmaImagens.setEnabled(false);
			}

			@Override
			public void onImagensJaSelecionadas(ImagensJaSelecionadasEvent event) {
				// TODO Auto-generated method stub
				
			}
		});
		trocaExpressao(2);
	}

	private void carregaFormQualAPergunta() {
		root.clear();
		root.add(new Label(constants.forme_a_pergunta()));
		HorizontalPanel horP = new HorizontalPanel();
		root.add(horP);
		listPerguntas = new ListBox();
		listPerguntas.addItem("Qual o melhor", "0");
		listPerguntas.addItem("Qual a melhor", "1");
		listPerguntas.addItem("O que é melhor", "2");
		listPerguntas.addChangeHandler(new ChangeHandler() {
			@Override
			public void onChange(ChangeEvent event) {
				lbPerguntaFinal.setText(listPerguntas.getItemText(listPerguntas.getSelectedIndex()) + " " + txtPerguntaIntermed.getText().trim() + " " + txtBuscaProd1.getText().trim() + constants.ou() + " " + txtBuscaProd2.getText());
			}
		});
		horP.add(listPerguntas);

		txtPerguntaIntermed = new TextBox();
		txtPerguntaIntermed.addChangeHandler(new ChangeHandler() {
			@Override
			public void onChange(ChangeEvent event) {
				lbPerguntaFinal.setText(listPerguntas.getItemText(listPerguntas.getSelectedIndex()) + " " + txtPerguntaIntermed.getText().trim() + " " + txtBuscaProd1.getText().trim() + constants.ou() + " " + txtBuscaProd2.getText());
			}
		});
		horP.add(txtPerguntaIntermed);

		txtBuscaProd1.setEnabled(false);
		horP.add(txtBuscaProd1);

		lbPerguntaFinal = new Label(listPerguntas.getItemText(listPerguntas.getSelectedIndex()) + " " + txtPerguntaIntermed.getText().trim() + " " + txtBuscaProd1.getText().trim() + constants.ou() + " " + txtBuscaProd2.getText());
		root.add(lbPerguntaFinal);

		Button btnGravar = new Button(constants.gravar());
		root.add(btnGravar);
		btnGravar.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				gravaComparacao2Coisas(0L, txtBuscaProd1.getText(), txtBuscaProd2.getText(), biProd1.getSelectedImagesSource(), biProd2.getSelectedImagesSource(), listPerguntas.getItemText(listPerguntas.getSelectedIndex()), txtPerguntaIntermed.getText());
			}
		});
	}

	private void gravaComparacao2Coisas(Long idUsuario, String nomeProduto1, String nomeProduto2, ArrayList<String> listEnderecoFotoProd1, ArrayList<String> listEnderecoFotoProd2, String perguntaOriginal, String perguntaIntermediariaOriginal) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});

		AsyncCallback<Comparacao> callback = new AsyncCallback<Comparacao>() {
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(Comparacao comp) {
				if (comp == null) {
					Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");	
				} else {
					Window.Location.replace("/comparacao/" + comp.getPath(ParametrosSistema.SiteHost.SITE_QUAL_O_MELHOR));
				}
			}
		};
		System.out.println("Salvando comparacao: idUsuario: " + idUsuario + ", nomeProduto1 = " + nomeProduto1 + ", nomeProduto2 = " + nomeProduto2 + ", enderecoFoto1.size = " + listEnderecoFotoProd1.size() + ", enderecoFoto2.size = " + listEnderecoFotoProd2.size());
		//serviceSupportSvc.gravaComparacao2Coisas(idUsuario, nomeProduto1, nomeProduto2, listEnderecoFotoProd1, listEnderecoFotoProd2, Byte.valueOf(listPerguntas.getValue(listPerguntas.getSelectedIndex())), txtPerguntaIntermed.getText(), callback);
	}
}